#include<iostream>
using namespace std;
#include<stdlib.h>
/*class A
{
 public:
     A(int a = 0)
        :_a(a)
     { 
         cout << "A(int a=0)" << endl;
     }
     ~A()
     {
         cout << "~A()" << endl;
                                
     }
 private:
         int _a;

};
int main()
{
    A* p1=(A*)malloc(sizeof(A));
    new(p1)A(2);//定位new

    return 0;
}*/
//////////////////////////模板//////////////////////
//泛型编程--模板
//模板参数（模板类型），后面类型名字随便取
//T代表了模板类型 template<typename T1,typename T2, ...>
/*template <typename T>//<class T>也可以
void Swap(T& left,T& right)
{
    T tmp=left;
    left=right;
    right=tmp;
}*/
//调用的并非同一个函数，建立的栈帧不同
//1,模板参数推演  2,函数模板实例化
//把T通过参数推演出具体类型-->替换T

/*int main()
{
    int i=10;
    int j=20;
    double x=12.5;
    double y=10.3;
    swap(x,y);//库里面的swap，不要需要显示提供
    swap(i,j);
    cout <<i<<" "<<j<<endl;
    cout <<x<<" "<<y<<endl;

    return 0;
}*/
template <typename T = int >//缺省参数
T Add(const T& x,const T& y)
{
    return x+y;
}
//可以同时存在，int类型的优先调用非模板函数
int Add(const int& x,const int& y)
{
    return x+y;
}

/*
int main()
{
    Add<>(5,10);//不写模板默认使用缺省类型int
    cout<<Add(1,2)<<endl;//隐式实例化，推导类型
    Add(1.2,1);//类型不一样，推演实例化失败
    Add((int)1.2,1);
    Add(1.2,(double)1);//自己进行类型转换
    cout<<Add<int>(1.1,2)<<endl;//显示实例化，指定类型
    cout<<Add<double>(1.1,2)<<endl;
    return 0;
}
*/ 

int main()
{
    return 0;
}





